package com.luo.dt.seata.tcc.service;

import com.luo.dt.common.model.result.RespResult;
import com.luo.dt.seata.tcc.model.dto.BusinessDto;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

/**
 * 业务服务本地TCC接口
 *
 * @author luohq
 * @date 2022-12-04 13:47
 */
@LocalTCC
public interface BusinessLocalTccService {

    /**
     * 本地业务
     *
     * @param businessDto 业务参数
     * @return 响应结果
     */
    @TwoPhaseBusinessAction(
            //该tcc的bean名称,写方法名便可，全局唯一
            name = "tryBusiness",
            //二阶段确认方法
            commitMethod = "commitBusiness",
            //二阶段取消方法
            rollbackMethod = "cancelBusiness",
            //启用tcc防护（避免幂等、空回滚、悬挂） TODO
            useTCCFence = false
    )
    RespResult tryBusiness(@BusinessActionContextParameter("businessDto") BusinessDto businessDto);

    /**
     * 确认方法，与@TwoPhaseBusinessAction.commitMethod对应
     * 注：context可以传递try方法的参数
     *
     * @param context 上下文
     * @return 是否成功
     */
    Boolean commitBusiness(BusinessActionContext context);

    /**
     * 回滚方法，与@TwoPhaseBusinessAction.rollbackMethod对应
     * 注：context可以传递try方法的参数
     *
     * @param context 上下文
     * @return 是否成功
     */
    Boolean cancelBusiness(BusinessActionContext context);
}
